View Javadoc
1 package jrre.instructionset.push; 2 3 import jrre.*; 4 import jrre.types.*; 5 import jrre.classloader.classfile.pool_entries.CPInfo; 6 import jrre.classloader.classfile.pool_entries.CPInteger; 7 import jrre.classloader.classfile.pool_entries.CPFloat; 8 import jrre.classloader.classfile.pool_entries.CPString; 9 import jrre.classloader.classfile.pool_entries.CPUTF8; 10 11 public class Ldc extends jrre.instructionset.Instruction { 12 13 private int operandOne; 14 15 public Ldc(int operandOne){ 16 17 this.operandOne = operandOne; 18 19 name = "ldc "+operandOne; 20 description = "pushes a constant."; 21 length = 1; 22 } 23 24 /*** 25 * Executes the <strong><code>ldc</code></strong> instruction. 26 * 27 */ 28 public void execute(){ 29 30 31 jrre.api.java.lang.Class thisClass = Stack.getClassContainingMethod(); 32 33 CPInfo constant = thisClass.getSymbol(operandOne); 34 35 if(constant instanceof CPString){ 36 if(jrre.JRRE.getVerbose()) 37 System.out.println("Executing ldc String: "+operandOne); 38 39 String constantString = ((CPUTF8)thisClass.getSymbol(((CPString)constant).getUTF8Index())).getValue(); 40 41 ArrayInstance charArray = new ArrayInstance(5, constantString.length()); 42 ReferenceType charArrayRef = new ReferenceType(charArray); 43 44 for(int i=0;i < constantString.length();i++) 45 charArray.setElement(i, new CharType(constantString.charAt(i))); 46 47 jrre.api.java.lang.Class stringClass = jrre.MethodArea.getClass("java/lang/String"); 48 if(stringClass == null) 49 return; 50 51 jrre.ObjectInstance stringObject = stringClass.instanceOf(); 52 53 // hash 54 stringObject.setInstanceValue(2, new PrimitiveType(0)); 55 56 // char array 57 stringObject.setInstanceValue(3, charArrayRef); 58 59 // length 60 stringObject.setInstanceValue(4, new PrimitiveType(constantString.length())); 61 // offset 62 stringObject.setInstanceValue(5, new PrimitiveType(0)); 63 64 Stack.pushOperand(new ReferenceType(stringObject)); 65 66 } 67 else if(constant instanceof CPInteger){ 68 69 if(jrre.JRRE.getVerbose()) 70 System.out.println("Executing ldc Integer: "+operandOne); 71 72 PrimitiveType newInteger = new PrimitiveType(((CPInteger)constant).getValue()); 73 Stack.pushOperand(newInteger); 74 } 75 else if(constant instanceof CPFloat){ 76 77 //System.out.println(constant +"In ldc float\n\n\n"); 78 79 FloatType floatType = new FloatType(((CPFloat)constant).getValue()); 80 Stack.pushOperand(floatType); 81 } 82 else 83 System.out.println("Need to implement "+constant+" in Ldc"); 84 85 } 86 87 public String toString(){ 88 StringBuffer toReturn = new StringBuffer(); 89 toReturn.append("ldc "); 90 toReturn.append(operandOne); 91 return toReturn.toString(); 92 } 93 }

This page was automatically generated by Maven